/*
 * @Description: 工具函数集合
 * @Author: Wenguang Song
 * @Date: 2022-04-26 11:13
 * @LastEditors: Wenguang Song
 * @LastEditTime: 2022-05-28 15:53
 * @FilePath: /call_service/src/common/js/utils.js
 */

/**
 * 判断对象类型
 * @param {*} val 指定属性
 * @return {*}
 */
export function isPlainObject(val) {
  return toString.call(val) === '[object Object]'
}

export function isNullObject(val) {
  return JSON.stringify(obj) === '{}'
}

/**
 * 判断数组类型
 * @param {*} val 指定属性
 * @return {*}
 */
export function isArray(val) {
  return toString.call(val) === '[object Array]'
}

/**
 * 判断字符串类型
 * @param {*} val 指定属性
 * @return {*}
 */
export function isString(val) {
  return toString.call(val) === '[object String]'
}

/**
 * 获取 url 指定参数内容
 * @param {*} 参数内容
 * @return {*}
 */
export function getQuery(_url, name) {
  let search = _url ? _url : window.location.search
  // if (search) {
  //   const KEY_REDIRECT = '?'
  //   const startIndex = window.location.href.indexOf(KEY_REDIRECT)
  //   search = window.location.href.substring(startIndex + 1)
  // }
  if (search.includes('?')) {
    const startIndex = search.indexOf('?')
    search = search.substring(startIndex + 1)
    var vars = search.split('&') || []
    for (var i = 0; i < vars.length; i++) {
      var pair = vars[i].split('=')
      if (pair[0] == name) {
        return pair[1]
      }
    }
  }
  return false
}

/**
 * 节流函数，通过控制每次事件执行的时间间隔控制短时间多次执行方法
 * @param {*} handler 要执行的方法
 * @param {*} wait 每次点击事件执行的时间间隔(毫秒)
 * @return {*}
 */
export function throttle(handler, wait = 1000) {
  var lastTime = 0
  var self = this,
    arg = arguments

  return function () {
    var nowTime = new Date().getTime()
    if (nowTime - lastTime > wait) {
      handler.apply(self, arg)
      lastTime = nowTime
    }
  }
}

/**
 * 防抖函数，通过推迟每次事件执行的时间来减少不必要的查询
 * @param {*} handler 要执行的方法
 * @param {*} delay 每次事件执行的推迟时间(毫秒)
 * @return {*}
 */
export function debounce(handler, delay) {
  var timer
  return function () {
    var self = this,
      arg = arguments
    clearTimeout(timer)
    timer = setTimeout(function () {
      handler.apply(self, arg)
    }, delay)
  }
}

/**
 * 图片转 Base64, 一般上传图片时使用
 * eg. const response = await uploadImgToBase64(file.raw)
 * @param {*} file 图片文件
 * @return {*}
 */
export function uploadImgToBase64(file) {
  return new Promise((resolve, reject) => {
    if (!window.FileReader) {
      console.error('抱歉，您的浏览器不支持 FileReader API!')
    }
    const reader = new FileReader()
    reader.readAsDataURL(file)
    reader.onload = function () {
      // 图片转base64完成后返回reader对象
      resolve(reader)
    }
    reader.onerror = reject
  })
}
